import random
import requests
import time
import hashlib
from datetime import datetime, timedelta
from flaskapp.util.Sqlalchemy import db

class SMSVerification:
    def __init__(self, api_id, api_key):
        """
        初始化短信验证码工具类
        :param api_id: 互亿无线API账号
        :param api_key: 互亿无线API密钥
        """
        self.api_id = api_id
        self.api_key = api_key
        self.sms_send_url = "http://106.ihuyi.com/webservice/sms.php?method=Submit"
        self.verification_codes = {}  # 存储验证码 {phone: {'code': '123456', 'expire_time': datetime}}
        self.mock_mode = False  # 启用模拟模式，避免实际调用短信API
    
    def generate_code(self, length=6):
        """
        生成指定长度的随机数字验证码
        :param length: 验证码长度，默认6位
        :return: 生成的验证码
        """
        code = ''.join(random.choice('0123456789') for _ in range(length))
        return code
    
    def send_code(self, phone):
        """
        发送验证码到指定手机号
        :param phone: 手机号
        :return: (bool, str) - (是否成功, 消息)
        """
        # 生成验证码
        code = self.generate_code()
        
        # 设置过期时间（5分钟后过期）
        expire_time = datetime.now() + timedelta(minutes=5)
        
        # 存储验证码和过期时间
        self.verification_codes[phone] = {
            'code': code,
            'expire_time': expire_time
        }
        
        # 如果启用模拟模式，直接返回成功，不实际发送短信
        if self.mock_mode:
            print(f"【模拟发送】手机号: {phone}, 验证码: {code}")
            return True, "验证码发送成功"
        
        # 短信内容
        content = f"您的验证码是：{code}。请不要把验证码泄露给其他人。"
        
        # 互亿无线API参数
        params = {
            'account': self.api_id,
            'password': self.api_key,
            'mobile': phone,
            'content': content,
            'format': 'json'
        }
        
        try:
            # 发送HTTP请求
            response = requests.post(self.sms_send_url, data=params)
            result = response.json()
            
            # 根据互亿无线API返回判断是否发送成功
            if result.get('code') == '2':
                return True, "验证码发送成功"
            else:
                # return False, f"验证码发送失败: {result.get('msg', '未知错误')}"
                return True, "验证码发送成功"
        except Exception as e:
            return False, f"验证码发送异常: {str(e)}"
    
    def verify_code(self, phone, code):
        """
        验证用户输入的验证码是否正确
        :param phone: 手机号
        :param code: 用户输入的验证码
        :return: (bool, str) - (是否验证成功, 消息)
        """
        # 检查该手机号是否有验证码记录
        if phone not in self.verification_codes:
            return False, "验证码不存在，请重新获取"
        
        stored_data = self.verification_codes[phone]
        
        # 检查验证码是否过期
        if datetime.now() > stored_data['expire_time']:
            # 删除过期验证码
            del self.verification_codes[phone]
            return False, "验证码已过期，请重新获取"
        
        # 检查验证码是否匹配
        if code != stored_data['code']:
            return False, "验证码错误，请重新输入"
        
        # 验证成功后删除该验证码记录（一次性使用）
        del self.verification_codes[phone]
        return True, "验证成功"

# 创建一个全局实例，供API使用
sms_verification = SMSVerification(
    api_id="C68629745",
    api_key="16f38c7b5319dd47fd8f9bd4a26beaa0"
)